/*
 * 描          述:  <描述>
 * 修  改   人:  Administrator
 * 修改时间:  2017年11月2日
 * <修改描述:>
 */
package com.tx.component.task.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.InitializingBean;

import com.tx.component.task.model.TaskDef;
import com.tx.component.task.model.TaskDetail;
import com.tx.component.task.service.TaskContextRegistry;
import com.tx.component.task.service.TaskDefService;
import com.tx.component.task.service.TaskStatusService;
import com.tx.core.exceptions.util.AssertUtils;

/**
  * 任务容器注册表<br/>
  * <功能详细描述>
  * 
  * @author  Administrator
  * @version  [版本号, 2017年11月2日]
  * @see  [相关类/方法]
  * @since  [产品/模块版本]
  */
public class TaskContextRegistryImpl
        implements InitializingBean, TaskContextRegistry {
    
    /** taskId2task的映射 */
    private final Map<String, TaskDef> taskId2taskMap = new HashMap<>();
    
    /** 任务定义业务层 */
    private TaskDefService taskDefService;
    
    /** 任务状态业务层 */
    private TaskStatusService taskStatusService;
    
    /** <默认构造函数> */
    public TaskContextRegistryImpl() {
        super();
    }
    
    /**
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
    }
    
    /**
     * @param taskDefList
     */
    @Override
    public void setIsModifyAble(List<TaskDef> taskDefList) {
        taskDefList.stream().forEach(t -> {
            if (taskId2taskMap.containsKey(t.getId())) {
                t.setModifyAble(false);
            }
        });
    }
    
    /**
     * @param taskDetailList
     */
    @Override
    public void setIsModifyAble4Detail(List<TaskDetail> taskDetailList) {
        taskDetailList.stream().forEach(t -> {
            if (taskId2taskMap.containsKey(t.getId())) {
                t.setModifyAble(false);
            }
        });
    }
    
    /**
     * @param taskDef
     */
    @Override
    public void registerTask(TaskDef taskDef, String signature) {
        AssertUtils.notNull(taskDef, "taskDef is null.");
        AssertUtils.notEmpty(taskDef.getId(), "taskDef.id is empty.");
        
        // 保存任务定义实例
        this.taskDefService.save(taskDef);
        // 保存并初始化任务定义
        this.taskStatusService.initByTaskId(taskDef.getId(), signature);
        
        // 任务id与任务定义之间的映射压入
        this.taskId2taskMap.put(taskDef.getId(), taskDef);
    }
    
    /**
     * @param 对taskDefService进行赋值
     */
    public void setTaskDefService(TaskDefService taskDefService) {
        this.taskDefService = taskDefService;
    }
    
    /**
     * @param 对taskStatusService进行赋值
     */
    public void setTaskStatusService(TaskStatusService taskStatusService) {
        this.taskStatusService = taskStatusService;
    }
    
}
